今天要來介紹的是Verilog中的always block~
always block通常用在描述時序邏輯或組合邏輯,這個是他的基本結構:
always @( sensitivity_list )
begin
	//一些指令描述
end
在always後的括號內,有一個叫做sensitivity_list的東西,這個列表決定了always會在哪種信號產生變化的時候被觸發且開始執行這塊block。
那在sensitivity_list中,可以包含的信號有:
always @(posedge clk) //clk在riding edge時觸發
begin
	if( A == 0 && B == 1 )
		C = 0;
	else if( A == 1 && B == 0 )
		C = 1;
end
always @( a or b or c ) //a,b,c三個輸入訊號其中一個發生變化時觸發
begin
	if( A == 0 && B == 1 )
		C = 0;
	else if( A == 1 && B == 0 )
		C = 1;
end
所以只要想好always要在什麼樣的變化下執行、是屬於第一類還是第二類就好了~再把欲執行的指令寫入begin。
always的block有兩種types:
舉個例子:
module newwork(A,B,clk,Q);
	input A,B,clk;
	output Q;
	reg Q;
	always @(posedge clk)
	begin
		if( A == 1 && B == 1 )
			Q <= 0; //Non-blocking Assignment
	end
endmodule
在這個例子中,如果clock為rising edge,Q值則會在always block結束後改變。
最後就來個練習啦~
module newwork(A,B,clk,Q,W);
	input A,B,clk;
	output Q,W;
	reg Q,W;
	wire a,b,c;
	
	always @(posedge clk) //clk為rising edge時觸發
	begin
		Q <= A & B; //Non-blocking Assignment,結束此block後才生效
	end
	
	always @(a | b | c) //a,b,c三者至少有一個訊號的輸入有變化時觸發
	begin
		W = a & ( c | b ); //程式跑到這行就直接執行,不用等整個block結束
	end
	
endmodule
今天就到這邊~